package com.kakame.dibaaz.tool;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 反射读取注解的工具类
 * @author 何家明  2018年2月27日 下午2:30:15
 * @see
 * @version 1.0
 */
public class AnnotationTool {
	
	/**
	 * 根据传入的某个类，查找里面面所有被特定注解修饰的方法
	 * @author 何家明  2018年2月27日 下午2:30:09
	 * @version 1.0
	 * @see 
	 * @param moduleClass
	 * @param annotationClass
	 * @return
	 */
	public static <T> List<Method> getMethodAnnotation(Class<?> moduleClass, Class<T> annotationClass) {
		List<Method> methodList = new ArrayList<>();
		if (moduleClass != null) {
			// 获取类中的所有的方法
			Method[] methods = moduleClass.getDeclaredMethods();
			if (methods != null && methods.length > 0) {
				for (Method method : methods) {
					Annotation[] annotations = method.getAnnotations();
					for (Annotation annotation : annotations) {
						if (annotation.annotationType() == annotationClass) {
							methodList.add(method);
						}
					}
				}
			}
		}
		return methodList;
	}

	/**
	 * 查找传入类集合中所有被指定注解修饰的类
	 * @author 何家明  2018年2月27日 下午2:31:46
	 * @version 1.0
	 * @see 
	 * @param clsList
	 * @param annotationClass
	 * @return
	 */
	public static <T> List<Class<?>> getClassAnnotation(List<Class<?>> clsList, Class<T> annotationClass) {
		List<Class<?>> classList = new ArrayList<>();
		if (clsList != null && clsList.size() > 0) {
			for (Class<?> cls : clsList) {
				Annotation[] annotations = cls.getAnnotations();
				for (Annotation annotation : annotations) {
					if (annotation.annotationType() == annotationClass) {
						classList.add(cls);
					}
				}
			}
		}
		return classList;
	}
}
